<?php

// 注意：
// 1.PHP7.1 后移除了 mcrypt ，考虑兼容性所以使用 openssl
// 2.加密模式用DES-EDE3是因为openssl不支持ECB模式
// 3.如果method为DES-ECB，则method为DES-ECB，则method为DES-ECB，则iv无需填写
// 如果为AES 方式需要传iv  16位字符串
// 填充方式说明：
// OPENSSL_NO_PADDING		无填充
// OPENSSL_ZERO_PADDING     0填充
// OPENSSL_RAW_DATA方式【会用PKCS7进行补位】 若此填充结果乱码则进行base64_encode转以下 解密时先base64_decode

class DesEncrypt
{
	//密钥
	private $secretKey;
	/*
	 * 构造方法
	 */
	public function __construct($secretKey = '')
	{
		$this->secretKey = $secretKey;
	}

	/**
	 * 加密
	 * @param $encrypted | 待加密字符串
	 * @param $key | 对称密钥
	 * @return string
	 */

	public function encrypt($encrypted)
	{
		$encData = openssl_encrypt($encrypted, 'DES-EDE3', $this->secretKey, OPENSSL_RAW_DATA);
		$encData = base64_encode($encData);
		return $encData;
	}

	/**
	 * 解密
	 * @param $decrypted  |待解密字符串
	 * @param $key |  对称密钥
	 * @return string
	 */

	public function decrypt($decrypted)
	{
		$decrypted = $this->specialCharReplaceBack($decrypted);
		$decrypted = base64_decode($decrypted);
		$decData   = openssl_decrypt($decrypted, 'DES-EDE3', $this->secretKey, OPENSSL_RAW_DATA);
		return $decData;
	}

	/***
	 * 特殊字符替换回来
	 * @param | data
	 * @return
	 */
	public function specialCharReplaceBack(string $str)
	{
		$arrone = ["-", "_"];
		$arrtwo = ["+", "/"];
		return str_replace($arrone, $arrtwo, $str, $i);
	}
}
